//=============================================================================
///	Memory
//=============================================================================

#ifndef	__SMEM_H__
#define	__SMEM_H__

#include <malloc.h>	// for size_t

#ifdef __cplusplus
extern "C" {
#endif

/// initialize memory
/**
	@param	gccb	callback function for garbage collection
*/
void smem_init(void* buf, size_t size, void (*gccb)(void));

/// allocate memory
void* smalloc(size_t size);

/// free memory (Don't call explicitly)
void sfree__(void* ptr);

#ifdef _DEBUG
/// raise gc when #idx alloc
void smem_set_raise_gc(int idx);
/// current alloc count
int smem_get_alloc_count(void);
#endif



#include "sexp.h"
void SMARK(SExp s);
void smark_ptr(void* ptr);

void ssweep(void);


/// dump state
#include "sexp.h"
void smem_dump(SExp ostrm);


#ifdef __cplusplus
} // extern "C"
#endif

#endif
